/*
 * c99.c - C99 标准特性示例
 * 
 * C99 (ISO/IEC 9899:1999) 是C语言的第二个官方标准，引入了许多新特性
 * 本示例展示了C99标准特有的功能
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <complex.h>

// C99支持单行注释
// 内联函数（C99新特性）
static inline int maxNum(int a, int b) {
    return (a > b) ? a : b;
}

// 可变长度数组 (VLA) - C99新特性
void vla_example(int size) {
    // 数组大小可以是变量
    int vla[size];
    
    printf("可变长度数组示例: ");
    for (int i = 0; i < size; i++) {  // C99允许在for循环初始化部分声明变量
        vla[i] = i * 10;
        printf("%d ", vla[i]);
    }
    printf("\n");
}

// C99新数据类型
void new_data_types() {
    // long long 整数类型
    long long ll = 9000000000000000000LL;
    
    // _Bool 布尔类型
    _Bool flag = 1;
    
    // complex 复数类型
    double complex z = 1.0 + 2.0 * I;
    
    printf("long long: %lld\n", ll);
    printf("_Bool: %d\n", flag);
    printf("complex: %.1f + %.1fi\n", creal(z), cimag(z));
}

// 复合字面量 - C99新特性
struct Point {
    int x;
    int y;
};

void print_point(struct Point p);
void complex_literals() {
    // 复合字面量允许在表达式中创建结构体实例
    struct Point p = (struct Point){10, 20};
    
    // 可以直接传递复合字面量给函数
    print_point((struct Point){30, 40});
    
    printf("结构体p: (%d, %d)\n", p.x, p.y);
}

void print_point(struct Point p) {
    printf("函数接收的点: (%d, %d)\n", p.x, p.y);
}

// 指定初始化器 - C99新特性
void designated_initializers() {
    // 可以按名称初始化结构体成员
    struct Point p = {.y = 20, .x = 10};  // 顺序可以打乱
    
    // 数组指定初始化器
    int array[5] = {[2] = 100, [4] = 200};
    
    printf("指定初始化的结构体: (%d, %d)\n", p.x, p.y);
    printf("指定初始化的数组: ");
    for (int i = 0; i < 5; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
}

// restrict 关键字 - C99新特性
// 用于优化指针操作，告诉编译器该指针是唯一访问所指向对象的方式
void restrict_example(int *restrict a, int *restrict b, int n) {
    for (int i = 0; i < n; i++) {
        a[i] = b[i] * 2;
    }
}

// 可变参数宏 - C99新特性
#define DEBUG_PRINT(fmt, ...) printf("DEBUG: " fmt "\n", __VA_ARGS__)

void variadic_macros() {
    DEBUG_PRINT("这是一个可变参数宏示例, 数字: %d, 字符串: %s", 42, "C99");
}

int main() {
    printf("=== C99 Standard Features ===\n\n");
    
    // 测试内联函数
    int maximum = maxNum(15, 25);
    printf("内联函数maxNum返回: %d\n\n", maximum);
    
    // 测试可变长度数组
    vla_example(5);
    printf("\n");
    
    // 测试新数据类型
    new_data_types();
    printf("\n");
    
    // 测试复合字面量
    complex_literals();
    printf("\n");
    
    // 测试指定初始化器
    designated_initializers();
    printf("\n");
    
    // 测试restrict关键字
    int source[] = {1, 2, 3, 4, 5};
    int dest[5];
    restrict_example(dest, source, 5);
    printf("restrict关键字示例 - 目标数组: ");
    for (int i = 0; i < 5; i++) {
        printf("%d ", dest[i]);
    }
    printf("\n\n");
    
    // 测试可变参数宏
    variadic_macros();
    
    return 0;
}